TFM: Predicción de Impacto del Salario Mínimo¶
Introducción¶
A lo largo de las últimas décadas se ha popularizado entre las instituciones internacionales de diversos países el uso del salario mínimo como medida paliativa a los bajos salariados percibidos entre las clases menos pudientes.
Estos actos parten de la premisa de que el establecimiento o incremento de un salario mínimo impulsará la capacidad adquisitiva de la clase afectada, produciendo así una mayor demanda de bienes y servicios por parte de la misma y en consecuencia impulsando el crecimiento económico. Si bien es cierto que la teoría económica respalda este argumento, los efectos negativos de estas políticas han sido ampliamente estudiados. Desde el lado crítico hacia estas políticas se argumenta que en determinadas circunstancias un incremento del salario mínimo puede fomentar el empleo informal o en última instancia destruir empleo.
El presente estudio no tendrá como objetivo específico afirmar o negar la efectividad del salario mínimo ni matizar los grupos más vulnerables a las bondades o daños del mismo, sino alcanzar un entendimiento relativo de las condicones adecuadas para aplicar el salario mínimo, así como entender qué efectos tiene este salario mínimo aplicado a nivel nacional sobre las diferentes regiones que componen el país considerando sus particularidades económicas.
Objetivos¶
Los objetivos del presente estudio será responder a las siguientes preguentas:
- ¿Cuáles son los efectos económicos generales de un incremento del salario mínimo en cada comunidad autónoma?
- ¿Existe un punto y ritmo óptimo de subida del salario mínimo con el que se puedan maximizar los beneficios que aporta el mismo?
Lo que se espera obtener con el presente trabajo respondiendo a estas preguntas no es tanto si es positivo o negativo aplicar un salario mínimo sino cuáles son los factores económicos que pueden permitir implementarlo con relativo éxito.
Base de Datos¶
Sets Empleados¶
Los datos utilizados para el presente análisis tienen como fuente principal el Instituto Nacional de Estadística, la Agencia Tributaria Española y el Ministerio de Seguridad Social. Los sets de datos empleados y sus respectivas variables son:
Encuestas de estructura salarial: Proporciona información de los salarios por hora tanto a nivel nacional como a nivel autonómico hasta por 3 segmentaciones, siendo las utilizadas en este caso las segmentaciones por por sexo y servicio. También se ha obtenido de este dataset el salario medio mensual por decil, comunidad autónoma y tipo de jornada, así como la desigualdad medida por el índice de Gini e índice S80/S20.
Índices de precios de consumo: Proporciona información sobre la evolución de los precios a nivel mensual, segmentado por tipo de índice y a nivel mensual.
Índice de precios industriales: Proporciona información sobre la evoluación de precios industriales, segmentados por el mercado objetivo.
Encuesta de presupuestos familiares: Proporciona información sobre el gasto medio de los hogares a nivel autonómico y de concepto de gasto clasificados por grupo de producto.
Estadísticas de movilidad nacional y geografía: Proporciona información acerca del número de parados, que incluye información también sobre los parados de larga duración.
Muestra Continua de Vidas Laborales: Obtenidas de las bases de datos del ministerio de seguridad social, contiene información sobre el número de afiliados por comunidad autónoma y sector laboral
Encuesta de condiciones de vida: Contiene información sobre las condiciones de vida de personas y hogares en España, como puede ser la tasa de riesgo de pobreza por comunidad autónoma, personas con carencia material etc.
Estadística Estructural de Empresas: Contiene información del número de empresas, así como del flujo de altas y bajas de las mismas.
Las variables de estos test a lo largo de las diferentes segmentaciones serán sometidas a análisis con el fin de obtener y justificar cuáles son las más útiles y relevantes para explicar los efectos del salario mínimo. El limpiado básico (correcciones de decimales, cambio de nombres de columnas para facilitar su uso y algunas fusiones de tables) se han hecho previo al análisis que se va a realizar a continuación.
Análisis y Modelos¶
Importación de paquetes¶
Los análisis pertinentes así como la realización de los modelos se hará usando el lenguaje de programación python, en concreto usando las librerías de pandas para el análisis y sklearn y otros módulos más específicos para la creación y testeo de modelos. Para la creación de gráficos ilustrativos para el análisis se utilizará matplotlib y seaborn
import pandas as pd
import sklearn as sk
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
from matplotlib.dates import AutoDateLocator
import matplotlib.dates as mdates
Definición de funciones¶
def create_basic_plot(x, y, xlabel="", ylabel="", title="", xticks_rotation=0, style="whitegrid", color="dodgerblue", marker = "o",figsize=(10, 6), save_path=None, label = "Salario Mínimo"):
"""
Create a professional-looking plot using matplotlib and seaborn.
Parameters:
x (array-like): Data for the x-axis.
y (array-like): Data for the y-axis.
xlabel (str): Label for the x-axis.
ylabel (str): Label for the y-axis.
title (str): Title of the plot.
xticks_rotation (int): Rotation angle for x-axis ticks.
style (str): Seaborn style to use (e.g., "whitegrid", "darkgrid").
color (str): Color of the plot line or bars.
figsize (tuple): Size of the figure (width, height).
save_path (str): If provided, saves the plot to the given file path.
Returns:
None
"""
# Set the Seaborn style for better aesthetics
sns.set_style(style)
# Create the plot
plt.figure(figsize=figsize)
plt.plot(x, y, marker=marker, color=color, linewidth=2.5, markersize=8, label = label)
# Add labels, title, and grid
plt.xlabel(xlabel, fontsize=12, labelpad=10)
plt.ylabel(ylabel, fontsize=12, labelpad=10)
plt.title(title, fontsize=14, weight="bold", pad=15)
plt.xticks(rotation=xticks_rotation, fontsize=10)
plt.yticks(fontsize=10)
plt.grid(visible=True, linestyle="--", alpha=0.7)
# Add a legend if needed
plt.legend(loc="best", fontsize=10, frameon=True)
# Improve layout
plt.tight_layout()
locator = AutoDateLocator() # Ajusta automáticamente el número de fechas visibles
plt.gca().xaxis.set_major_locator(locator)
# Save the plot if save_path is provided
if save_path:
plt.savefig(save_path, dpi=300, bbox_inches="tight")
print(f"Plot saved to {save_path}")
# Show the plot
plt.show()
def create_dual_plot(
x, y1, y2, xlabel="", ylabel1="", ylabel2="", title="",
xticks_rotation=0, style="whitegrid",
color1="dodgerblue", color2="orange", marker1="o", marker2="s",
label1="Serie 1", label2="Serie 2", figsize=(10, 6),
secondary_y=False, save_path=None
):
"""
Create a professional-looking plot with two y-series using matplotlib and seaborn,
with an optional secondary y-axis.
Parameters:
x (array-like): Data for the x-axis.
y1 (array-like): Data for the first y-axis series.
y2 (array-like): Data for the second y-axis series.
xlabel (str): Label for the x-axis.
ylabel1 (str): Label for the first y-axis.
ylabel2 (str): Label for the second y-axis (if secondary_y is True).
title (str): Title of the plot.
xticks_rotation (int): Rotation angle for x-axis ticks.
style (str): Seaborn style to use (e.g., "whitegrid", "darkgrid").
color1 (str): Color for the first y-axis series.
color2 (str): Color for the second y-axis series.
marker1 (str): Marker style for the first y-axis series.
marker2 (str): Marker style for the second y-axis series.
label1 (str): Label for the first y-axis series (for the legend).
label2 (str): Label for the second y-axis series (for the legend).
figsize (tuple): Size of the figure (width, height).
secondary_y (bool): Whether to use a secondary y-axis for the second series.
save_path (str): If provided, saves the plot to the given file path.
Returns:
None
"""
# Set the Seaborn style for better aesthetics
sns.set_style(style)
# Create the figure and primary axis
fig, ax1 = plt.subplots(figsize=figsize)
# Plot the first series on the primary y-axis
line1 = ax1.plot(x, y1, marker=marker1, color=color1, linewidth=2.5, markersize=8, label=label1)
ax1.plot(x, y1, marker=marker1, color=color1, linewidth=2.5, markersize=8, label=label1)
ax1.set_xlabel(xlabel, fontsize=12, labelpad=10)
ax1.set_ylabel(ylabel1, fontsize=12, labelpad=10, color=color1)
ax1.tick_params(axis='y')
ax1.tick_params(axis='x', rotation=xticks_rotation)
ax1.grid(visible=True, linestyle="--", alpha=0.7)
if secondary_y:
# Add a second y-axis
ax2 = ax1.twinx()
line2 = ax2.plot(x, y2, marker=marker2, color=color2, linewidth=2.5, markersize=8, label=label2)
ax2.plot(x, y2, marker=marker2, color=color2, linewidth=2.5, markersize=8, label=label2)
ax2.set_ylabel(ylabel2, fontsize=12, labelpad=10, color=color2)
ax2.tick_params(axis='y')
#ax2.legend(loc="upper right", fontsize=10, frameon=True)
else:
line2 = []
# Plot the second series on the primary y-axis
ax1.plot(x, y2, marker=marker2, color=color2, linewidth=2.5, markersize=8, label=label2)
#ax1.legend(loc="best", fontsize=10, frameon=True)
# Add title and legend for the first axis
lines = line1 + line2
labels = [l.get_label() for l in lines]
ax1.legend(lines, labels, loc="best", fontsize=10, frameon=True)
fig.suptitle(title, fontsize=14, weight="bold", y=1.02)
# Adjust layout
fig.tight_layout()
# Adjust x-axis for date formatting if needed
locator = AutoDateLocator() # Automatically adjusts visible date labels
ax1.xaxis.set_major_locator(locator)
# Save the plot if save_path is provided
if save_path:
plt.savefig(save_path, dpi=300, bbox_inches="tight")
print(f"Plot saved to {save_path}")
# Show the plot
plt.show()
def create_multi_category_plot(data, x_col, y_col, category_col, xlabel="", ylabel="", label = None,title="", xticks_rotation=0, style="whitegrid", palette="husl", figsize=(12, 7), save_path=None):
"""
Create a professional-looking multi-line plot for different categories.
Parameters:
data (DataFrame): The dataset containing the data to plot.
x_col (str): Column name for the x-axis.
y_col (str): Column name for the y-axis.
category_col (str): Column name for the categories (lines in the plot).
xlabel (str): Label for the x-axis.
ylabel (str): Label for the y-axis.
title (str): Title of the plot.
xticks_rotation (int): Rotation angle for x-axis ticks.
style (str): Seaborn style to use (e.g., "whitegrid", "darkgrid").
palette (str): Color palette for the categories.
figsize (tuple): Size of the figure (width, height).
save_path (str): If provided, saves the plot to the given file path.
Returns:
None
"""
if label is None:
label = category_col
# Set Seaborn style for better aesthetics
sns.set_style(style)
# Create the plot
plt.figure(figsize=figsize)
unique_categories = data[category_col].unique()
colors = sns.color_palette(palette, len(unique_categories))
for i, category in enumerate(unique_categories):
subset = data[data[category_col] == category]
plt.plot(
subset[x_col],
subset[y_col],
#marker="o",
linewidth=2.5,
markersize=8,
label=category,
color=colors[i]
)
# Add labels, title, and grid
plt.xlabel(xlabel, fontsize=12, labelpad=10)
plt.ylabel(ylabel, fontsize=12, labelpad=10)
plt.title(title, fontsize=14, weight="bold", pad=15)
plt.xticks(rotation=xticks_rotation, fontsize=10)
plt.yticks(fontsize=10)
plt.grid(visible=True, linestyle="--", alpha=0.7)
# Add a legend
plt.legend(title=label, fontsize=10, title_fontsize=12, loc="best", frameon=True)
# Improve layout
plt.tight_layout()
locator = AutoDateLocator() # Ajusta automáticamente el número de fechas visibles
plt.gca().xaxis.set_major_locator(locator)
# Save the plot if save_path is provided
if save_path:
plt.savefig(save_path, dpi=300, bbox_inches="tight")
print(f"Plot saved to {save_path}")
# Show the plot
plt.show()
def create_category_subplots(data, x_col, y_col, category_col, xlabel="", ylabel="", title="",
xticks_rotation=45, style="whitegrid", palette="husl",
figsize=(30, 22.5), n_cols=3, save_path=None):
"""
Create individual subplots for each category in the data with adjusted margins.
"""
import matplotlib.ticker as mticker
# Set Seaborn style for aesthetics
sns.set_style(style)
# Get unique categories and assign colors
unique_categories = data[category_col].unique()
n_categories = len(unique_categories)
n_rows = -(-n_categories // n_cols) # Calculate rows (ceiling division)
colors = sns.color_palette(palette, n_categories)
# Create subplots
fig, axes = plt.subplots(n_rows, n_cols, figsize=figsize, sharex=False, sharey=True)
axes = axes.flatten() # Flatten to iterate easily
for i, category in enumerate(unique_categories):
ax = axes[i]
subset = data[data[category_col] == category]
ax.plot(
subset[x_col],
subset[y_col],
#marker="o",
linewidth=1.5,
markersize=4,
label=category,
color=colors[i]
)
ax.set_title(f"{category}", fontsize=10, weight="bold", pad=5)
ax.grid(visible=True, linestyle="--", alpha=0.7)
# Set x-axis ticks to show fewer values
ax.xaxis.set_major_locator(mticker.MaxNLocator(5))
ax.tick_params(axis='x', rotation=xticks_rotation, labelsize=6)
ax.tick_params(axis='y', labelsize=6)
# Hide unused subplots
for j in range(len(axes)):
if j >= n_categories:
axes[j].set_visible(False)
# Set labels for shared axes
fig.text(0.5, 0.02, xlabel, ha='center', fontsize=12) # Adjusted position
fig.text(0.04, 0.5, ylabel, va='center', rotation='vertical', fontsize=12) # Adjusted position
# Add the main title
fig.suptitle(title, fontsize=16, weight="bold", y=0.98)
# Adjust layout with extra margins
fig.subplots_adjust(left=0.08, right=0.97, bottom=0.08, top=0.92, wspace=0.3, hspace=1)
fig.tight_layout()
# Save the figure if save_path is provided
if save_path:
plt.savefig(save_path, dpi=300, bbox_inches="tight")
print(f"Plot saved to {save_path}")
# Show the plot
plt.show()
Análisis descriptivo¶
La base de este análisis consistirá en considerar un grupo de variables de partida que nos permita describir un sistema económico a través de un determinado número de variables o ratios, y que, a través del salario mínimo, ver como ese sistema pasa del estado A al estado B. Esto implica que las variables predictoras también pueden ser utilizadas como resultados en el entrenamiento, ya que nos interesa ver cómo estas evolucionan como resutado de los cambios en el salario mínimo.
En última instancia nos interesa analizar qué pasaría si estando en el estado inicial A con un salario mínimo interprofesional (o una medida derivada del mismo) X que nos lleva al estado B, qué ocurriría si el SMI en su lugar fuese Y.
Análisis general de variables¶
Salario Mínimo Inteprofesional¶
La principal variable independiente y que será el principal input será el salario mínimo interprofesinal (smi), que es fijado por ley y generalmente empieza aplicar todos los años en enero o, alternativamente se aprueba más adelante pero con efecto retroactivo desde enero.
smi = pd.read_csv("../../processed_data/salarios/salarios_smis_aeat.csv")[['periodo','smi_14']].drop_duplicates()
smi
| periodo | smi_14 | |
|---|---|---|
| 0 | 2008 | 600.0 |
| 252 | 2009 | 624.0 |
| 504 | 2010 | 633.3 |
| 756 | 2011 | 641.4 |
| 1008 | 2012 | 641.4 |
| 1260 | 2013 | 645.3 |
| 1512 | 2014 | 645.3 |
| 1764 | 2015 | 648.6 |
| 2016 | 2016 | 655.2 |
| 2268 | 2017 | 707.7 |
| 2520 | 2018 | 735.9 |
| 2772 | 2019 | 900.0 |
| 3024 | 2020 | 950.0 |
| 3248 | 2021 | 965.0 |
| 3472 | 2022 | 1000.0 |
create_basic_plot(x=smi['periodo'], y=smi['smi_14'], xlabel="Año", ylabel="SMI", title="Evoluación del SMI", xticks_rotation=0, style="whitegrid", color="dodgerblue", figsize=(10, 6), save_path="../../images/smi.png")
Plot saved to ../../images/smi.png
La evolución del SMI nominal es bastante irregular, creciendo un 22.65% en 10 años y luego una cantidad muy similar (22.3%) en solo un año. Tengamos en cuenta que este SMI es en términos nominales y no tiene en cuenta la inflación, por ello es importante considerar el ipc dentro de la ecuación para obtener un resultado en relación de poder adquisitivo.
ipc = pd.read_csv("../../processed_data/gasto_ipc_ipri/ipc.csv")
ipc_nacional = ipc[(ipc['ccaa'] == "Nacional") & (ipc['grupo_indice'] == "Índice general") & (ipc['tipo_dato'] == "Índice") & (ipc.mes==1) & (ipc.año>=2008)][['año', 'Total']]
smi = smi.merge(ipc_nacional, left_on = "periodo", right_on="año")
smi['smi_ajustado'] = smi['smi_14']/smi['Total']*100
create_basic_plot(x=smi['periodo'], y=smi['smi_ajustado'], xlabel="Año", ylabel="SMI", title="SMI Ajustado por Inflación a Precios de 2021", xticks_rotation=0, style="whitegrid", color="dodgerblue", figsize=(10, 6), save_path="../../images/smi_ajustado.png")
Plot saved to ../../images/smi_ajustado.png
Observamos ahora que la evolución del salario mínimo, pese a que conserva el gran incremento entre 2018 y 2019, tiene variaciones negativas en determinados años y la gamma de posibles incrementos que aporta es algo más amplia.
smi.columns
Index(['periodo', 'smi_14', 'año', 'Total', 'smi_ajustado'], dtype='object')
IPC¶
El índice de precios de consumo (IPC) describe la evolución de los precios a lo largo del tiempo, tomando como base 100 un determinado año y calculando el resto de valores a partir de los incrementos que se producen año a año. Este índice se puede desglosar en varias categorías, lo que nos puede permitir ver cómo evoluciona cada una de ellas y qué valor está aportando al índice total.
ipc.grupo_indice.unique()
array(['Índice general', '01 Alimentos y bebidas no alcohólicas',
'02 Bebidas alcohólicas y tabaco', '03 Vestido y calzado',
'04 Vivienda, agua, electricidad, gas y otros combustibles',
'05 Muebles, artículos del hogar y artículos para el mantenimiento corriente del hogar',
'06 Sanidad', '07 Transporte', '08 Comunicaciones',
'09 Ocio y cultura', '10 Enseñanza', '11 Restaurantes y hoteles',
'12 Otros bienes y servicios'], dtype=object)
ipc
| ccaa | grupo_indice | tipo_dato | periodo | Total | mes | año | periodo_fecha | |
|---|---|---|---|---|---|---|---|---|
| 0 | Nacional | Índice general | Índice | 2024M10 | NaN | 10 | 2024 | 2024-10-01 |
| 1 | Nacional | Índice general | Índice | 2024M09 | 115.009 | 9 | 2024 | 2024-09-01 |
| 2 | Nacional | Índice general | Índice | 2024M08 | 115.707 | 8 | 2024 | 2024-08-01 |
| 3 | Nacional | Índice general | Índice | 2024M07 | 115.660 | 7 | 2024 | 2024-07-01 |
| 4 | Nacional | Índice general | Índice | 2024M06 | 116.212 | 6 | 2024 | 2024-06-01 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 284955 | Melilla | 12 Otros bienes y servicios | Variación en lo que va de año | 2002M05 | 2.300 | 5 | 2002 | 2002-05-01 |
| 284956 | Melilla | 12 Otros bienes y servicios | Variación en lo que va de año | 2002M04 | 1.900 | 4 | 2002 | 2002-04-01 |
| 284957 | Melilla | 12 Otros bienes y servicios | Variación en lo que va de año | 2002M03 | 1.900 | 3 | 2002 | 2002-03-01 |
| 284958 | Melilla | 12 Otros bienes y servicios | Variación en lo que va de año | 2002M02 | 1.700 | 2 | 2002 | 2002-02-01 |
| 284959 | Melilla | 12 Otros bienes y servicios | Variación en lo que va de año | 2002M01 | NaN | 1 | 2002 | 2002-01-01 |
284960 rows × 8 columns
ipc_nacional_es = ipc[(ipc['ccaa'] == "Nacional") & (ipc['grupo_indice'] == "Índice general") & (ipc['tipo_dato'] == "Índice") ][['periodo_fecha', 'Total']].sort_values('periodo_fecha', ascending = True)
create_basic_plot(ipc_nacional_es['periodo_fecha'], ipc_nacional_es['Total'], xlabel="Periodo", ylabel="IPC", title="Evolución del IPC (Nacional)", xticks_rotation=0, style="whitegrid", color="dodgerblue", figsize=(10, 6),marker = None , label = "IPC",save_path="../../images/ipc.png")
Plot saved to ../../images/ipc.png
create_multi_category_plot(data = ipc[(ipc['ccaa']=="Nacional") & (ipc['tipo_dato'] == "Índice")].sort_values(['periodo_fecha', 'grupo_indice'], ascending=True), x_col="periodo_fecha", y_col="Total", category_col="grupo_indice", xlabel="Año", ylabel="IPC", title="IPC", xticks_rotation=0, style="whitegrid", palette="Set2", figsize=(12, 7), save_path="../../images/ipc_grupos.png")
Plot saved to ../../images/ipc_grupos.png
create_category_subplots(data = ipc[(ipc['ccaa']=="Nacional") & (ipc['tipo_dato'] == "Índice")].sort_values(['periodo_fecha', 'grupo_indice'], ascending=True), x_col="periodo_fecha", y_col="Total", category_col="grupo_indice", xlabel="Año", ylabel="IPC", title="IPC", xticks_rotation=0, style="whitegrid", palette="Set2", figsize=(12, 7), save_path="../../images/ipc_grupos.png")
Plot saved to ../../images/ipc_grupos.png
Parece claro que salvo contadas excepciones como la sanidad, ocio y cultura, comunicaciones y vestido y calzado el resto de índices siguen una clara tendencia creciente. Dado que este estudio empleará datos de comunidades autónomas es intersante también observar la evolución del IPC en cada una de estas.
create_multi_category_plot(data = ipc[(ipc['ccaa']!="Nacional") & (ipc['tipo_dato'] == "Índice") & (ipc["grupo_indice"] == "Índice general")].sort_values(['periodo_fecha', 'grupo_indice'], ascending=True), x_col="periodo_fecha", y_col="Total", category_col="ccaa", xlabel="Año", ylabel="IPC", title="IPC", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/ipc_general_ccaa.png")
Plot saved to ../../images/ipc_general_ccaa.png
Parece claro que la evolución se produce de manera conjunta, tanto en tendencia como en estacionalidad. Veamos cómo es la variación interanual.
create_category_subplots(data = ipc[(ipc['ccaa']!="Nacional") & (ipc['tipo_dato'] == "Variación anual") & (ipc["grupo_indice"] == "Índice general")].sort_values(['periodo_fecha', 'grupo_indice'], ascending=True), x_col="periodo_fecha", y_col="Total", category_col="ccaa", xlabel="Año", ylabel="", title="Variación Anual Porcentual del IPC", style="whitegrid", palette="Set2", figsize=(12, 7), xticks_rotation=15,save_path="../../images/ipc_ccaa_subplots.png")
Plot saved to ../../images/ipc_ccaa_subplots.png
Se observa de manera clara que si bien en magnitud la variación puede diferir, el patrón es el mismo en todas las comunidades autónomas.
ipc.tipo_dato.unique()
array(['Índice', 'Variación mensual', 'Variación anual',
'Variación en lo que va de año'], dtype=object)
IPRI¶
El índice de precios industriales (IPRI) mide la evolución mensual de los precios de los productos fabricados por la industria y vendidos en el mercado interior en la primera etapa de su comercialización. Dada esta definición, es esperable suponer que una variación del IPRI puede ser un predictor de una futura del IPC al trasladarse esta subida al consumidor, por ello se ha incluido en este análisis.
ipri = pd.read_csv("../../processed_data/gasto_ipc_ipri/ipri.csv")
ipri = ipri[pd.to_datetime(ipri['periodo_fecha']) >= pd.to_datetime('2002-01-01')]
ipri_nacional = ipri[(ipri['ccaa'] == "Nacional") & (ipri['destino_economico'] == "Total industria") & (ipri['tipo_dato'] == "Índice") ][['periodo_fecha', 'Total']].sort_values('periodo_fecha', ascending = True)
create_basic_plot(ipri_nacional['periodo_fecha'], ipri_nacional['Total'], xlabel="Periodo", ylabel="IPRI", title="Evolución del IPRI (Nacional)", xticks_rotation=0, style="whitegrid", color="dodgerblue", figsize=(10, 6),marker = None , label = "IPRI",save_path="../../images/ipc.png")
Plot saved to ../../images/ipc.png
ipc_ipri_nacional = ipc_nacional_es.merge(ipri_nacional[['periodo_fecha', 'Total']].rename(columns = {'Total': 'ipri'}), left_on = "periodo_fecha", right_on="periodo_fecha")
create_dual_plot(ipc_ipri_nacional['periodo_fecha'], ipc_ipri_nacional['Total'], ipc_ipri_nacional['ipri'], xlabel="Año", label1= "IPC", label2="IPRI", title="IPC y IPRI (Nacional)", xticks_rotation=0, style="whitegrid", figsize=(10, 6), marker1=None, marker2=None ,save_path="../../images/ipc_ipri.png")
Plot saved to ../../images/ipc_ipri.png
cond = (ipc_ipri_nacional['periodo_fecha'] >= '2010-01-01') & (ipc_ipri_nacional['periodo_fecha'] <= '2012-01-01')
create_dual_plot(ipc_ipri_nacional[cond]['periodo_fecha'], ipc_ipri_nacional[cond]['Total'], ipc_ipri_nacional[cond]['ipri'], xlabel="Año", label1= "IPC", label2="IPRI", title="IPC y IPRI (Nacional)", xticks_rotation=0, style="whitegrid", figsize=(10, 6), marker1=None, marker2=None ,save_path="../../images/ipc_ipri.png")
Plot saved to ../../images/ipc_ipri.png
Se observa que el movimiento de ambos es correlado hasta 2021, donde el IPRI se desliga y sube de manera mucho más agresiva. La correlación directa en la tendencia general viene además acompañada de una correlación más local entre el incremento del IPRI y un posterior incremento del IPC, veáse esta última imagen donde en varios meses el IPRI adelanta un incremento del IPC
Gasto Hogares¶
La Encuesta de Presupuestos Familiares del INE nos permite obtener información sobre el gasto medio por hogar y por familiar. Esto puede ser de gran utilidad, pues a diferencia del IPC por comunidad autónoma, que tiene un valor fijado en su respectivo territorio en un periodo dado, el gasto por hogar nos permite hacernos una idea de la variación de costes de vida entre las diferentes regiones del territorio Nacional.
gasto_hogares = pd.read_csv("../../processed_data/gasto_ipc_ipri/gasto_hogar.csv")
gasto_hogares.head(5)
| ccaa | tipo_dato | tipo_gasto | grupo_gasto | periodo | Total | absence_data | |
|---|---|---|---|---|---|---|---|
| 0 | Total Nacional | Dato base | Gasto total | Índice general | 2023 | 6.298171e+08 | NaN |
| 1 | Total Nacional | Dato base | Gasto total | Índice general | 2022 | 6.008695e+08 | NaN |
| 2 | Total Nacional | Dato base | Gasto total | Índice general | 2021 | 5.517205e+08 | NaN |
| 3 | Total Nacional | Dato base | Gasto total | Índice general | 2020 | 5.087382e+08 | NaN |
| 4 | Total Nacional | Dato base | Gasto total | Índice general | 2019 | 5.668146e+08 | NaN |
gasto_persona = gasto_hogares[(gasto_hogares['grupo_gasto'] == "Índice general") & (gasto_hogares['tipo_gasto'] == "Gasto medio por persona") & (gasto_hogares['tipo_dato'] == "Dato base")]
gasto_persona_nacional = gasto_hogares[(gasto_hogares['ccaa'] == "Total Nacional") & (gasto_hogares['tipo_dato'] == "Dato base") & (gasto_hogares['grupo_gasto'] == "Índice general") & (gasto_hogares['tipo_gasto'] == "Gasto medio por persona")][['periodo', 'Total']]
create_basic_plot(gasto_persona_nacional['periodo'], gasto_persona_nacional['Total'], xlabel="Año", ylabel="Gasto (€)", title="Gasto medio por persona (Nacional)", xticks_rotation=0, style="whitegrid", color="dodgerblue", figsize=(10, 6), label="Gasto por Persona",save_path="../../images/gasto_persona_nacional.png")
Plot saved to ../../images/gasto_persona_nacional.png
gasto_hogares.grupo_gasto.unique()
array(['Índice general', '01 Alimentos y bebidas no alcohólicas',
'02 Bebidas alcohólicas y tabaco', '03 Vestido y calzado',
'04 Vivienda, agua, electricidad, gas y otros combustibles',
'05 Muebles, artículos del hogar y artículos para el mantenimiento corriente del hogar',
'06 Sanidad', '07 Transporte', '08 Comunicaciones',
'09 Ocio y cultura', '10 Enseñanza', '11 Restaurantes y hoteles',
'12 Otros bienes y servicios'], dtype=object)
El gasto total varía bastante a lo largo de los años, sufriendo una gran caída en 2020 por la pandemia y posteriorment un gran rebote, ya que se produjo un gran incremento del consumo. Es importante tener en cuenta que el gasto agregado, al tener incluidos gastos no necesarios para la subsistencia del individuo, no es tan indicativo del coste de vida en el país o en una determinada region.
Para tener un mejor entendimiento a este respecto, podemos focalizarnos en gastos específicos como alimentos, bebidas no alcohólicas, vivienda, gas electricidad, transporte y sanidad, que englobaremos bajo el manto de "gastos básicos"
# gastos_basicos = ['01 Alimentos y bebidas no alcohólicas', '04 Vivienda, agua, electricidad, gas y otros combustibles','06 Sanidad', '07 Transporte']
gastos_basicos = ['01 Alimentos y bebidas no alcohólicas', '04 Vivienda, agua, electricidad, gas y otros combustibles']
gasto_basico = gasto_hogares[(gasto_hogares['tipo_gasto'] == "Gasto medio por persona") & (gasto_hogares['tipo_dato'] == "Dato base") & gasto_hogares.grupo_gasto.isin(gastos_basicos)]
gasto_basico
| ccaa | tipo_dato | tipo_gasto | grupo_gasto | periodo | Total | absence_data | |
|---|---|---|---|---|---|---|---|
| 720 | Total Nacional | Dato base | Gasto medio por persona | 01 Alimentos y bebidas no alcohólicas | 2023 | 2145.40 | NaN |
| 721 | Total Nacional | Dato base | Gasto medio por persona | 01 Alimentos y bebidas no alcohólicas | 2022 | 2044.49 | NaN |
| 722 | Total Nacional | Dato base | Gasto medio por persona | 01 Alimentos y bebidas no alcohólicas | 2021 | 1935.89 | NaN |
| 723 | Total Nacional | Dato base | Gasto medio por persona | 01 Alimentos y bebidas no alcohólicas | 2020 | 1840.02 | NaN |
| 724 | Total Nacional | Dato base | Gasto medio por persona | 01 Alimentos y bebidas no alcohólicas | 2019 | 1722.11 | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 67477 | Melilla | Dato base | Gasto medio por persona | 04 Vivienda, agua, electricidad, gas y otros c... | 2010 | 2104.02 | NaN |
| 67478 | Melilla | Dato base | Gasto medio por persona | 04 Vivienda, agua, electricidad, gas y otros c... | 2009 | 1827.15 | NaN |
| 67479 | Melilla | Dato base | Gasto medio por persona | 04 Vivienda, agua, electricidad, gas y otros c... | 2008 | 1663.17 | NaN |
| 67480 | Melilla | Dato base | Gasto medio por persona | 04 Vivienda, agua, electricidad, gas y otros c... | 2007 | 1715.69 | NaN |
| 67481 | Melilla | Dato base | Gasto medio por persona | 04 Vivienda, agua, electricidad, gas y otros c... | 2006 | 1422.23 | NaN |
720 rows × 7 columns
gasto_basico_nacional = gasto_basico[(gasto_basico['ccaa'] == "Total Nacional")].groupby(['periodo'], as_index=False).sum(numeric_only=True)
create_basic_plot(gasto_basico_nacional['periodo'], gasto_basico_nacional['Total'], xlabel="Año", ylabel="Gasto (€)", title="Gasto básicos medios por persona (Nacional)", xticks_rotation=0, style="whitegrid", color="dodgerblue", figsize=(10, 6), label="Gasto por Persona",save_path="../../images/gasto_basico_persona_nacional.png")
Plot saved to ../../images/gasto_basico_persona_nacional.png
gasto_basico_nacional_smi = gasto_basico_nacional.rename(columns={'Total': 'gasto_basico'}).merge(smi, how='right', on="periodo")
create_dual_plot(gasto_basico_nacional_smi['periodo'], gasto_basico_nacional_smi['gasto_basico'], gasto_basico_nacional_smi['smi_14'], xlabel="Año", ylabel1="Gasto basico(€)", ylabel2="SMI (€)" ,label1= "Gastos básicos", label2="SMI", title="Gastos Básicos y SMI", xticks_rotation=0, style="whitegrid", figsize=(10, 6), marker1=None, marker2=None, secondary_y=True ,save_path="../../images/gastos_basicos_smi_nacional.png")
Plot saved to ../../images/gastos_basicos_smi_nacional.png
Vemos que ahora el gasto tiene una evolución algo menos volátil y de hecho sigue una evolución bastante más parecida al IPC general y también tiene una clara correlación con el SMI, aunque dada la baja proporción de trabajadores que percibe el salario mínimo, no necesariamente hablamos de una relación causal. Para hacernos una idea de las diferencias en costes en las diferentes comunidades autónomas, veamos cómo evoluciona el gasto por persona en las 3 comunidades autónomas con más gasto medio y con menos gasto medio.
CCAA_mas_gasto = ['País Vasco', 'Madrid, Comunidad de', 'Navarra, Comunidad Foral de']
CCAA_menos_gasto = ['Extremadura', 'Canarias', 'Murcia, Región de']
CCAA_mostrar = CCAA_mas_gasto+CCAA_menos_gasto
gasto_basico_ccaa = gasto_basico[(gasto_basico['ccaa'].isin(CCAA_mostrar))].groupby(['periodo','ccaa'], as_index=False).sum(numeric_only=True)
create_multi_category_plot(data = gasto_basico_ccaa, x_col="periodo", y_col="Total", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="Gasto(€)", title="Gastos básicos medios por persona (CCAA)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/ipc_general_ccaa.png")
Plot saved to ../../images/ipc_general_ccaa.png
La tendencia pese a ser general presenta variaciones mensuales relevantes, así como diferentes notables entre las diferentes comunidades autónomas y el gasto por persona que tiene cada una, encontrándonos diferencias superiores al 50%. Estos valores los usaremos más adelante en este análisis para crear ratios útiles que nos permitan entender el poder real de compra que que tiene el salario mínimo en las diferentes regiones.
Salarios¶
Los salarios son necesarios para entender la coyuntura de cada territorio, por lo que es importante estudiar cómo han variado con el tiempo y así poder identificar posibles grupos afectados por el salario mínimo.
salarios_ocupacion = pd.read_csv("../../processed_data/salarios/ocupacion.csv")
salarios_ocupacion.head(5)
| ccaa | ocupacion | sexo | periodo | salario_hora | salario_año | |
|---|---|---|---|---|---|---|
| 0 | Andalucía | Alta | Ambos sexos | 2008 | 17.80 | 27948.84 |
| 1 | Andalucía | Alta | Ambos sexos | 2009 | 18.72 | 29275.72 |
| 2 | Andalucía | Alta | Ambos sexos | 2010 | 19.41 | 30421.77 |
| 3 | Andalucía | Alta | Ambos sexos | 2011 | 19.21 | 30463.95 |
| 4 | Andalucía | Alta | Ambos sexos | 2012 | 19.06 | 30026.52 |
salarios_ocupacion_nacional = salarios_ocupacion[(salarios_ocupacion['ccaa'] == "Total Nacional") & (salarios_ocupacion['sexo'] == "Ambos sexos")]
create_multi_category_plot(salarios_ocupacion_nacional, "periodo", "salario_año", "ocupacion", xlabel="Año", ylabel="Salario (€)",label="Nivel de Ocupación" ,xticks_rotation=0, style="whitegrid", figsize=(12, 7), title= "Salario Anual por Ocupación",save_path="../../images/salarios_ocupacion_nacional.png")
Plot saved to ../../images/salarios_ocupacion_nacional.png
create_multi_category_plot(salarios_ocupacion_nacional, "periodo", "salario_hora", "ocupacion", xlabel="Año", ylabel="Salario/Hora (€)",label="Nivel de Ocupación" ,xticks_rotation=0, style="whitegrid", figsize=(12, 7), title= "Salario por Hora por Ocupación",save_path="../../images/salarios_ocupacion_nacional.png")
Plot saved to ../../images/salarios_ocupacion_nacional.png
Observamos que no hay una diferencia particular en términos de crecimiento salarial, lo que a priori puede indicar que no hay ningún grupo especialmente afectado por el salario mínimo. Veamos como evoluciona el salario de la ocupación más baja respecto al SMI.
salario_oc_nacional_baja_smi = salarios_ocupacion_nacional[salarios_ocupacion_nacional['ocupacion'] == "Baja"].merge(smi, how="left", on="periodo")
create_dual_plot(salario_oc_nacional_baja_smi['periodo'], salario_oc_nacional_baja_smi['salario_año'], salario_oc_nacional_baja_smi['smi_14'],
xlabel="Año", ylabel1="Salario Anual (€)", ylabel2="SMI (€)" ,label1= "Salario Anual", label2="SMI", title="Salario de ocupación baja y SMI",
xticks_rotation=0, style="whitegrid", figsize=(10, 6), marker1=None, marker2=None, secondary_y=True ,save_path="../../images/gastos_basicos_smi_nacional.png")
Plot saved to ../../images/gastos_basicos_smi_nacional.png
salario_oc_nacional_alta_smi = salarios_ocupacion_nacional[salarios_ocupacion_nacional['ocupacion'] == "Alta"].merge(smi, how="left", on="periodo")
create_dual_plot(salario_oc_nacional_alta_smi['periodo'], salario_oc_nacional_alta_smi['salario_año'], salario_oc_nacional_alta_smi['smi_14'],
xlabel="Año", ylabel1="Salario Anual (€)", ylabel2="SMI (€)" ,label1= "Salario Anual", label2="SMI", title="Salario de ocupación baja y SMI",
xticks_rotation=0, style="whitegrid", figsize=(10, 6), marker1=None, marker2=None, secondary_y=True ,save_path="../../images/salario_alto_smi_nacional.png")
Plot saved to ../../images/salario_alto_smi_nacional.png
Aunque la evolución del salario de ocupacion baja parezca corelacionado con el salario mínimo, también lo parece así el de la ocupación alta, lo que puede descartar una causalidad. No obstante, hemos de tener en cuenta que las ocupaciones bajas corresponden a puestos que serán en general menos productivos y cuya productividad también crecerá en general más lento, por lo que es posible que el crecimiento de los salarios en en sectores de nivel de ocupación alta vaya más relacionado con la productividad y la de la ocupación baja más relacionado con el movimiento del salario mínimo.
También es importante tener en cuenta que a nivel político la propuesta de subida del salario mínimo gira en torno a llegar al 60% del salario medio, lo que implica algo de causalidad entre el nivel de salarios y la subida de salarios mínimos a realizar, si bien es cierto que al depender esta medida más de cuestiones políticas que de cuestiones económicas es precipitado dar por supuesta esta causalidad.
Veamos también cómo evoluciona el salario de las ocupaciones bajas en las comunidades autónomas que hemos mostrado antes:
salarios_ocupacion_ccaa = salarios_ocupacion[(salarios_ocupacion['ccaa'] != "Total Nacional") & (salarios_ocupacion['sexo'] == "Ambos sexos")]
salarios_oc_baja_ccaa = salarios_ocupacion_ccaa[(salarios_ocupacion_ccaa['ocupacion'] == "Baja") & (salarios_ocupacion_ccaa['ccaa'].isin(CCAA_mostrar))]
create_multi_category_plot(data = salarios_oc_baja_ccaa, x_col="periodo", y_col="salario_año", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="Salario Anual (€)", title="Salario de ocupacion baja (CCAA)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/salario_ocupacion_baja_ccaa.png")
Plot saved to ../../images/salario_ocupacion_baja_ccaa.png
Es interesante observar que en País Vasco y Navarra los salarios están en constante creciemiento, mientras que para las otras comunidades mostradas la tendencia es relativamente plana hasta 2015, a partir de cuando se empieza a ver un crecimiento más sólido, coincidiendo con el comienzo de los incrementos del salario mínmo más fuertes, lo que nos indica que no todas las comunidades autónomas siguen una correlación similar.
Es importante que de 2018 a 2019 (donde se produjo el mayor incremento de salario mínimo hasta la fecha) no necesariamente tenemos que ver un gran incremento del salario, puesto que una reducción del número de horas trabajadas amortiguaría el incremento.
Es interesante también, para enconctrar posibles grupos afectados, estudiar la evoluación de los salarios en función de la jornada y en función del contrato.
salarios_jornada = pd.read_csv("../../processed_data/salarios/jornada.csv")
salarios_jornada.head(5)
| jornada | ccaa | decil | periodo | salario_mes | absence_data | |
|---|---|---|---|---|---|---|
| 0 | Total | Total Nacional | Total decil | 2022 | 2128.37 | NaN |
| 1 | Total | Total Nacional | Total decil | 2021 | 2086.78 | NaN |
| 2 | Total | Total Nacional | Total decil | 2020 | 2038.59 | NaN |
| 3 | Total | Total Nacional | Total decil | 2019 | 1982.31 | NaN |
| 4 | Total | Total Nacional | Total decil | 2018 | 1944.42 | NaN |
salarios_jornada.dtypes
jornada object ccaa object decil object periodo int64 salario_mes float64 absence_data float64 dtype: object
salarios_jornada["salario_año"] = salarios_jornada['salario_mes']*12
salarios_jornada_nacional = salarios_jornada[(salarios_jornada['ccaa'] == "Total Nacional")
& (salarios_jornada['decil'] == "Total decil")]
create_multi_category_plot(data = salarios_jornada_nacional, x_col="periodo", y_col="salario_año", label = "Tipo de Jornada",category_col="jornada", xlabel="Año", ylabel="Salario Anual (€)", title="Salario por tipo de Joranda (Nacional)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/salario_jornada_nacional.png")
Plot saved to ../../images/salario_jornada_nacional.png
De nuevo se puede extraer una conclusión similar a la que comentábamos previamente, atendiendo a que el crecimiento de los sueldos se empieza a notar después de 2015 para los trabajadores a jornada parcial. Veamos si se puede apreciar algo por sector.
salarios_sector = pd.read_csv("../../processed_data/salarios/sector.csv")
salarios_sector.head(5)
| ccaa | sector | sexo | periodo | salario_año | absence_data | salario_hora | |
|---|---|---|---|---|---|---|---|
| 0 | Andalucía | Construcción | Ambos sexos | 2008 | 19839.25 | NaN | 11,55 |
| 1 | Andalucía | Construcción | Ambos sexos | 2009 | 20246.77 | NaN | 12,02 |
| 2 | Andalucía | Construcción | Ambos sexos | 2010 | 20801.34 | NaN | 12,19 |
| 3 | Andalucía | Construcción | Ambos sexos | 2011 | 21185.48 | NaN | 12,54 |
| 4 | Andalucía | Construcción | Ambos sexos | 2012 | 21204.91 | NaN | 12,53 |
salarios_sector_nacional = salarios_sector[(salarios_sector['ccaa'] == "Total Nacional")
& (salarios_sector['sexo'] == "Ambos sexos")]
create_multi_category_plot(data = salarios_sector_nacional, x_col="periodo", y_col="salario_año", label = "Sector",category_col="sector", xlabel="Año", ylabel="Salario Anual (€)", title="Salario por Sector (Nacional)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/salario_sector_nacional.png")
Plot saved to ../../images/salario_sector_nacional.png
De nuevo, observamos que los conjuntos de salarios más bajos empiezan a tener un crecimiento sostenido tras 2015, mientras que en sectores mejor pagados como la industria el crecimiento es más continuado en todo el periodo analizado.
Empleos¶
El número de ocupados es otra de las métricas que puede ser afectadas por un incremento del salario mínimo, por lo que es importante estudiar el cambio de estos en el tiempo.
ocupados_jornada = pd.read_csv("../../processed_data/trabajo/ocupados_sector.csv")
ocupados_jornada.head(5)
| sexo | ccaa | tipo_jornada | unidad | periodo | Total | absence_data | |
|---|---|---|---|---|---|---|---|
| 0 | Ambos sexos | Total Nacional | Total | Valor absoluto | 2024T3 | 21823.0 | NaN |
| 1 | Ambos sexos | Total Nacional | Total | Valor absoluto | 2024T2 | 21684.7 | NaN |
| 2 | Ambos sexos | Total Nacional | Total | Valor absoluto | 2024T1 | 21250.0 | NaN |
| 3 | Ambos sexos | Total Nacional | Total | Valor absoluto | 2023T4 | 21389.7 | NaN |
| 4 | Ambos sexos | Total Nacional | Total | Valor absoluto | 2023T3 | 21446.5 | NaN |
ocupados_jornada.unidad.unique()
array(['Valor absoluto', 'Porcentaje'], dtype=object)
#Agrupamos por año haciendo la media
ocupados_jornada['año'] = ocupados_jornada['periodo'].str[0:4]
ocupados_jornada = ocupados_jornada.groupby(['sexo', 'ccaa', 'tipo_jornada', 'unidad', 'año'], as_index=False).mean(numeric_only=True)
ocupados_jornada
| sexo | ccaa | tipo_jornada | unidad | año | Total | absence_data | |
|---|---|---|---|---|---|---|---|
| 0 | Ambos sexos | Andalucía | Jornada a tiempo completo | Porcentaje | 2002 | 91.450000 | NaN |
| 1 | Ambos sexos | Andalucía | Jornada a tiempo completo | Porcentaje | 2003 | 90.975000 | NaN |
| 2 | Ambos sexos | Andalucía | Jornada a tiempo completo | Porcentaje | 2004 | 91.075000 | NaN |
| 3 | Ambos sexos | Andalucía | Jornada a tiempo completo | Porcentaje | 2005 | 87.325000 | NaN |
| 4 | Ambos sexos | Andalucía | Jornada a tiempo completo | Porcentaje | 2006 | 87.325000 | NaN |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 8275 | Mujeres | Total Nacional | Total | Valor absoluto | 2020 | 8772.750000 | NaN |
| 8276 | Mujeres | Total Nacional | Total | Valor absoluto | 2021 | 9100.325000 | NaN |
| 8277 | Mujeres | Total Nacional | Total | Valor absoluto | 2022 | 9432.925000 | NaN |
| 8278 | Mujeres | Total Nacional | Total | Valor absoluto | 2023 | 9805.550000 | NaN |
| 8279 | Mujeres | Total Nacional | Total | Valor absoluto | 2024 | 10019.566667 | NaN |
8280 rows × 7 columns
ocupados_jornada_nacional = ocupados_jornada[(ocupados_jornada['ccaa'] == "Total Nacional") & (ocupados_jornada['sexo'] == "Ambos sexos")
& (ocupados_jornada['unidad'] == "Valor absoluto")]
create_multi_category_plot(data = ocupados_jornada_nacional, x_col="año", y_col="Total", label = "Tipo de Jornada",category_col="tipo_jornada", xlabel="Año", ylabel="Ocupados (Miles de Personas)", title="Ocupados por tipo de Jornada (Nacional)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/ocupados_jornada_nacional.png")
Plot saved to ../../images/ocupados_jornada_nacional.png
Se aprecia de manera clara que el número de ocupados crece especialmente en tiempo completo, siendo el crecimiento del trabajo a tiempo parcial algo más residual en el tiempo, si bien es cierto qu elos porcentajes de cada uno sobre el total tienen una mayor variación. Veamos cómo evoluciona el porcentaje de ocupados a tiempo parcial dentro de cada comunidad autónoma.
ocupados_jornada_ccaa = ocupados_jornada[(ocupados_jornada['ccaa'].isin(CCAA_mostrar)) & (ocupados_jornada['sexo'] == "Ambos sexos")
& (ocupados_jornada['unidad'] == "Porcentaje") & (ocupados_jornada['tipo_jornada'] == "Jornada a tiempo parcial")]
create_multi_category_plot(data = ocupados_jornada_ccaa, x_col="año", y_col="Total", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="Porcentaje (%)", title="Ocupacion a tiempo parcial (CCAA)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/ocupacion_parcial_ccaa.png")
Plot saved to ../../images/ocupacion_parcial_ccaa.png
ocupados_jornada_ccaa = ocupados_jornada[(ocupados_jornada['ccaa'].isin(CCAA_mostrar)) & (ocupados_jornada['sexo'] == "Ambos sexos")
& (ocupados_jornada['unidad'] == "Valor absoluto") & (ocupados_jornada['tipo_jornada'] == "Total")]
create_multi_category_plot(data = ocupados_jornada_ccaa, x_col="año", y_col="Total", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="Ocupados (Miles de personas)", title="Ocupacion (CCAA)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/ocupacion_parcial_ccaa.png")
Plot saved to ../../images/ocupacion_parcial_ccaa.png
De nuevo, la tendencia es conjunta, pero la diferencia entre comunidades autónomas es notable. En los años de mayores subida del salario mínimo no se observa a priori ninguna variación que nos pueda indicar un impacto del salario mínimo en dichos años. El número total de ocupados tampoco parece indicarnos nada concreto.
PIB¶
El producto interior bruto (PIB), aparte de ser un buen indicador del tamaño de la región, es útil para determinar la riqueza de dicha región al dividirlo entre su número de habitantes (lo que sería el PIB per cápita).
pib_abs = pd.read_csv("../../processed_data/pib/pib_abs.csv")
pib_per_capita = pd.read_csv("../../processed_data/pib/pib_per_capita.csv")
pib_abs.head(5)
| ccaa | valor | periodo | tipo_dato | |
|---|---|---|---|---|
| 0 | Andalucía | 86568676.0 | 2000 | Valor |
| 1 | Aragón | 20071592.0 | 2000 | Valor |
| 2 | Asturias, Principado de | 14305047.0 | 2000 | Valor |
| 3 | Balears, Illes | 16545333.0 | 2000 | Valor |
| 4 | Canarias | 26048646.0 | 2000 | Valor |
pib_per_capita.head(5)
| ccaa | valor | periodo | tipo_dato | |
|---|---|---|---|---|
| 0 | Andalucía | 11856.0 | 2000 | Valor |
| 1 | Aragón | 16716.0 | 2000 | Valor |
| 2 | Asturias, Principado de | 13418.0 | 2000 | Valor |
| 3 | Balears, Illes | 20094.0 | 2000 | Valor |
| 4 | Canarias | 15622.0 | 2000 | Valor |
CCAA_mostrar
['País Vasco', 'Madrid, Comunidad de', 'Navarra, Comunidad Foral de', 'Extremadura', 'Canarias', 'Murcia, Región de']
pib_per_capita.ccaa.unique()
array(['Andalucía', 'Aragón', 'Asturias, Principado de', 'Balears, Illes',
'Canarias', 'Cantabria', 'Castilla y León', 'Castilla - La Mancha',
'Cataluña', 'Comunitat Valenciana', 'Extremadura', 'Galicia',
'Madrid, Comunidad de', 'Murcia, Región de',
'Navarra, Comunidad Foral de', 'País Vasco', 'Rioja, La',
'Ceuta y Melilla'], dtype=object)
pib_per_capita_ccaa = pib_per_capita[pib_per_capita['ccaa'].isin(CCAA_mostrar) & (pib_per_capita['tipo_dato'] == "Valor")]
create_multi_category_plot(data = pib_per_capita_ccaa, x_col="periodo", y_col="valor", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="PIB per Cápita (€)", title="PIB per Cápita (CCAA)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/pib_per_capita_ccaa.png")
Plot saved to ../../images/pib_per_capita_ccaa.png
Observamos que las diferencias entre comunidades autónomas no son nada despreciables, pues Madrid dobla a lo largo de todo el periodo el PIB per capita de extremadura. Así mismo se ve además que el crecimiento de estas regiones más pobres es claramente inferior.
Paro¶
El paro nos indica el número de personas que no tienen empleo pero que estás buscando empleo activamente. Esta variable es de utilidad, pues variaciones en el paro pueden ser un buen predictor que acompañe al salario mínimo así como un buen resultado a estudiar a consecuencia de un incremento del SMI.
paro = pd.read_csv("../../processed_data/paro/parados.csv")
paro
| sexo | ccaa | edad | periodo | tasa_paro_total | absence_data | |
|---|---|---|---|---|---|---|
| 0 | Ambos sexos | Total Nacional | Total | 2023 | 12.18 | NaN |
| 1 | Ambos sexos | Total Nacional | Total | 2022 | 13.03 | NaN |
| 2 | Ambos sexos | Total Nacional | Total | 2021 | 14.91 | NaN |
| 3 | Ambos sexos | Total Nacional | Total | 2020 | 15.53 | NaN |
| 4 | Ambos sexos | Total Nacional | Total | 2019 | 14.10 | NaN |
| ... | ... | ... | ... | ... | ... | ... |
| 7555 | Mujeres | Melilla | 55 y más años | 2010 | 1.85 | NaN |
| 7556 | Mujeres | Melilla | 55 y más años | 2009 | 1.18 | NaN |
| 7557 | Mujeres | Melilla | 55 y más años | 2008 | 16.61 | NaN |
| 7558 | Mujeres | Melilla | 55 y más años | 2007 | 22.27 | NaN |
| 7559 | Mujeres | Melilla | 55 y más años | 2006 | 7.38 | NaN |
7560 rows × 6 columns
paro_ccaa = paro[(paro['ccaa'].isin(CCAA_mostrar)) & (paro['sexo'] == "Ambos sexos") & (paro['edad'] == "Total")]
create_multi_category_plot(data = paro_ccaa, x_col="periodo", y_col="tasa_paro_total", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="Tasa de paro (%)", title="Tasa de paro (CCAA)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/paro_ccaa.png")
Plot saved to ../../images/paro_ccaa.png
De nuevo, las diferencias entre comunidades autónomas son destacables. Aprovechando que tenemos el desglose por por edad y sexo, veamos cómo ha evolucionado el paro según estas dos variables.
paro_edad = paro[(paro['ccaa']=="Total Nacional") & (paro['sexo'] == "Ambos sexos") ]
create_multi_category_plot(data = paro_edad, x_col="periodo", y_col="tasa_paro_total", label = "Edad",category_col="edad", xlabel="Año", ylabel="Tasa de paro (%)", title="Tasa de paro por edades", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/paro_edad.png")
Plot saved to ../../images/paro_edad.png
paro.sexo.unique()
array(['Ambos sexos', 'Hombres', 'Mujeres'], dtype=object)
paro_sexo = paro[(paro['ccaa']=="Total Nacional") & (paro['edad'] == "Total") ]
create_multi_category_plot(data = paro_sexo, x_col="periodo", y_col="tasa_paro_total", label = "Sexo",category_col="sexo", xlabel="Año", ylabel="Tasa de paro (%)", title="Tasa de paro por sexo", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/paro_sexo.png")
Plot saved to ../../images/paro_sexo.png
paro.edad.unique()
array(['Total', 'Menores de 25 años', '25 y más años', 'De 16 a 19 años',
'De 20 a 24 años', 'De 25 a 54 años', '55 y más años'],
dtype=object)
paro['sexo-edad'] = paro['sexo'] + "-" + paro['edad']
paro_sexo_edad = paro[(paro['ccaa']=="Total Nacional") & (paro['sexo'].isin(['Hombres', 'Mujeres'])) & (paro['edad'].isin(['De 16 a 19 años', 'De 20 a 24 años', 'De 25 a 54 años', '55 y más años'])) ]
create_multi_category_plot(data = paro_sexo_edad, x_col="periodo", y_col="tasa_paro_total", label = "Sexo y Edad",category_col="sexo-edad", xlabel="Año", ylabel="Tasa de paro (%)", title="Tasa de paro por sexo y edad", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/paro_sexo_edad.png")
Plot saved to ../../images/paro_sexo_edad.png
Parece claro que los jóvenes son los más afectados por el desempleo, sufriendo los incrementos más grandes a lo largo del tiempo, y alcanzando los valores más altos. A priori este debería ser de los posibles grupos afectados por el salario mínimo, pues un incremento en el mismo podría provocar una mayor dificultad de inserción en el mercado laboral.
En lo que respesta a sexo, parece que el grupo más afectado son las mujeres dentro de todas las edades.
paro_duracion = pd.read_csv("../../processed_data/paro/parados_tiempo.csv")
Otro factor relevante a tener en cuenta en el análisis es qué porcentaje de parados son de larga duración, algo que puede pasar desapercibido en un análisis superficial y que puede ser un indicativo de efectos a más largo plazo como la dificultad de reinserción.
paro_duracion.head(5)
| sexo | ccaa | tiempo_busqueda | periodo | porcentaje_tipo_paro | absence_data | |
|---|---|---|---|---|---|---|
| 0 | Ambos sexos | Total Nacional | Total | 2023 | 100.0 | NaN |
| 1 | Ambos sexos | Total Nacional | Total | 2022 | 100.0 | NaN |
| 2 | Ambos sexos | Total Nacional | Total | 2021 | 100.0 | NaN |
| 3 | Ambos sexos | Total Nacional | Total | 2020 | 100.0 | NaN |
| 4 | Ambos sexos | Total Nacional | Total | 2019 | 100.0 | NaN |
paro_duracion['tiempo_busqueda'].unique()
array(['Total', 'Ya ha encontrado empleo', 'Menos de 1 mes',
'De 1 mes a menos de 3 meses', 'De 3 meses a menos de 6 meses',
'De 6 meses a menos de 1 año', 'De 1 año a menos de 2 años',
'2 años o más'], dtype=object)
paro_tiempo_busqueda = paro_duracion[(paro_duracion['ccaa']=="Total Nacional") & (paro_duracion['sexo'] == "Ambos sexos") & (paro_duracion['tiempo_busqueda']!="Total")]
create_multi_category_plot(data = paro_tiempo_busqueda, x_col="periodo", y_col="porcentaje_tipo_paro", label = "Tiempo de búsqueda",category_col="tiempo_busqueda", xlabel="Año", ylabel="Porcentaje de parados (%)", title="Parados según su tiempo de búsqueda", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/paro_tiempo_busqueda.png")
Plot saved to ../../images/paro_tiempo_busqueda.png
paro_tiempo_largo_ccaa= paro_duracion[(paro_duracion['ccaa'].isin(CCAA_mostrar)) & (paro_duracion['sexo'] == "Ambos sexos")
& (paro_duracion['tiempo_busqueda']=="2 años o más")]
create_multi_category_plot(data = paro_tiempo_largo_ccaa, x_col="periodo", y_col="porcentaje_tipo_paro", label = "CCAA",category_col="ccaa",
xlabel="Año", ylabel="Porcentaje de parados (%)",
title="Parados de larga duración por comunidad autónoma", xticks_rotation=0, style="whitegrid",
figsize=(12, 7), save_path="../../images/paro_tiempo_busqueda.png")
Plot saved to ../../images/paro_tiempo_busqueda.png
Al igual que con todas las variables previamente observadas, vemos que la evolución por comunidad autónoma sigue la misma tendencia, aunque las diferencias entre cada una no se pueden pasar por alto.
Productividad¶
La productividad es un factor importante al estudiar el salario mínimo. Una alta productividad da más margen para incrementos salariales, mientras que una baja productividad puede fomentar una mayor cantidad de despidos.
El dataset escogido de productividad, obtenido del Observatorio de Productividad y Competitividad de España (OPCE) contiene además información útil sobre qué componentes son los que contribuyen a la productividad
productividad = pd.read_csv("../../processed_data/productividad/productividad_ccaa.csv")
productividad = productividad[productividad.periodo>=2008]
productividad.variable.unique()
array(['VAB', 'Empleo total', 'Horas trabajadas totales',
'Capital productivo',
'Productividad del trabajo por hora trabajada',
'Productividad del trabajo por ocupado',
'Productividad del capital productivo',
'Contribución del capital productivo al crecimiento del VAB',
'Contribución de las horas trabajadas al crecimiento del VAB',
'Contribución de los cambios en la composición del trabajo al crecimiento del VAB',
'Contribución de la PTF al crecimiento del VAB',
'Contribución del capital productivo al crecimiento de la productividad por hora trabajada',
'Contribución de la PTF al crecimiento de la productividad por hora trabajada',
'Participación de los servicios del capital en el VAB',
'Participación de las rentas del trabajo en el VAB'], dtype=object)
productividad_hora = productividad[(productividad['variable'] == 'Productividad del trabajo por hora trabajada') & (productividad.unidad == "Euros de 2015 por hora trabajada")]
productividad_hora_ccaa = productividad_hora[productividad_hora['ccaa'].isin(CCAA_mostrar)]
create_multi_category_plot(data = productividad_hora_ccaa, x_col="periodo", y_col="total", label = "CCAA",category_col="ccaa", xlabel="Año", ylabel="Productividad (€)", title="Productividad del trabajo por hora (€ de 2015)", xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/productividad_hora.png")
Plot saved to ../../images/productividad_hora.png
productividad_ocupado = productividad[(productividad['variable'] == 'Productividad del trabajo por ocupado') & (productividad.unidad == "Euros de 2015 por persona ocupada")]
productividad_ocupado_ccaa = productividad_ocupado[productividad_ocupado['ccaa'].isin(CCAA_mostrar)]
create_multi_category_plot(data = productividad_ocupado_ccaa, x_col="periodo", y_col="total", label = "CCAA",category_col="ccaa",
xlabel="Año", ylabel="Productividad (€)", title="Productividad por ocupado (€ de 2015)",
xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/productividad_ocupado.png")
Plot saved to ../../images/productividad_ocupado.png
#Obtenemos el promedio de horas por empleo para ver la evolución
empleo = productividad[(productividad.variable == "Empleo total") &
(productividad.unidad == "Miles de personas")].drop(['variable', 'unidad'], axis=1).rename(columns = {'total': 'empleo'})
horas_trabajadas = productividad[(productividad.variable == "Horas trabajadas totales") &
(productividad.unidad == "Millones de horas")].drop(['variable', 'unidad'], axis=1).rename(columns = {'total': 'horas_trabajadas'})
empleo_hora = pd.merge(empleo, horas_trabajadas, on=['periodo', 'ccaa'])
empleo_hora['empleo_hora'] = empleo_hora.horas_trabajadas/empleo_hora.empleo
create_multi_category_plot(data = empleo_hora[empleo_hora['ccaa'].isin(CCAA_mostrar)], x_col="periodo", y_col="empleo_hora", label = "CCAA",category_col="ccaa",
xlabel="Año", ylabel="Miles de horas", title="Horas trabajadas por empleo",
xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/horas_empleo.png")
Plot saved to ../../images/horas_empleo.png
De estas gráficas se puede extraer la conclusión de que comunidades autónomas como Canarias tienen una mayor proporción de empleo poco productivo, pues pese a trabajar de media más horas que un vasco la productividad por hora agregada a partir de 2015 acaba siendo menor.
Empresas¶
Las empresas y tamaño nos pueden informar de qué tan resistente puede ser una economía dada a un incremento del salario mínimo, pues empresas pequeñas con menos recursos tendrán menos capacidad de hacer frente a los gastos necesarios y consecuentemente podrán optar más por el despido o por cerrar.
empresas = pd.read_csv("../../processed_data/empresas/empresas.csv")
empresas.estrato_asalariados_grupo.unique()
array(['Total', 'No asalariados', 'Pequeñas y Medianas Empresas',
'Grandes Empresas'], dtype=object)
empresas
| ccaa | actividad_principal | estrato_asalariados | periodo | total_empresas | 2_dig | estrato_asalariados_grupo | |
|---|---|---|---|---|---|---|---|
| 0 | Total Nacional | Total CNAE | Total | 2020 | 3404428 | Total CNAE | Total |
| 1 | Total Nacional | Total CNAE | Total | 2019 | 3363197 | Total CNAE | Total |
| 2 | Total Nacional | Total CNAE | Total | 2018 | 3337646 | Total CNAE | Total |
| 3 | Total Nacional | Total CNAE | Total | 2017 | 3282346 | Total CNAE | Total |
| 4 | Total Nacional | Total CNAE | Total | 2016 | 3236582 | Total CNAE | Total |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 1048570 | Ceuta | 501 Transporte marítimo de pasajeros | De 50 a 99 | 2017 | 0 | 50 | Pequeñas y Medianas Empresas |
| 1048571 | Ceuta | 501 Transporte marítimo de pasajeros | De 50 a 99 | 2016 | 0 | 50 | Pequeñas y Medianas Empresas |
| 1048572 | Ceuta | 501 Transporte marítimo de pasajeros | De 50 a 99 | 2015 | 0 | 50 | Pequeñas y Medianas Empresas |
| 1048573 | Ceuta | 501 Transporte marítimo de pasajeros | De 50 a 99 | 2014 | 0 | 50 | Pequeñas y Medianas Empresas |
| 1048574 | Ceuta | 501 Transporte marítimo de pasajeros | De 50 a 99 | 2013 | 0 | 50 | Pequeñas y Medianas Empresas |
1048575 rows × 7 columns
empresas_todo = empresas[(empresas.ccaa == "Total Nacional") & (empresas.actividad_principal == "Total CNAE") & (empresas.estrato_asalariados != "Total")].groupby(['periodo', 'estrato_asalariados_grupo'], as_index=False).agg({'total_empresas': 'sum'})
create_multi_category_plot(data = empresas_todo, x_col="periodo", y_col="total_empresas", label = "Estrato de Asalariados",category_col="estrato_asalariados_grupo",
xlabel="Año", ylabel="Número de empresas", title="Empresas por Estrato de Asalariados",
xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/empresas_asalariados.png")
Plot saved to ../../images/empresas_asalariados.png
empresas.estrato_asalariados.unique()
array(['Total', 'Sin asalariados', 'De 1 a 2', 'De 3 a 5', 'De 6 a 9',
'De 10 a 19', 'De 20 a 49', 'De 50 a 99', 'De 100 a 199',
'De 200 a 499', 'De 500 a 999', 'De 1000 a 4999',
'De 5000 o más asalariados'], dtype=object)
empresas_pequeñas_ccaa
| periodo | ccaa | total_empresas | actividad_principal | estrato_asalariados | total_empresas_total | 2_dig | estrato_asalariados_grupo | porcentaje_empresas_pequeñas | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 2008 | Canarias | 67647 | Total CNAE | Total | 143471 | Total CNAE | Total | 4.715030e-01 |
| 1 | 2008 | Canarias | 67647 | 05 Extracción de antracita, hulla y lignito | Total | 1 | 05 | Total | 6.764700e+04 |
| 2 | 2008 | Canarias | 67647 | 051 Extracción de antracita y hulla | Total | 1 | 05 | Total | 6.764700e+04 |
| 3 | 2008 | Canarias | 67647 | 052 Extracción de lignito | Total | 0 | 05 | Total | inf |
| 4 | 2008 | Canarias | 67647 | 06 Extracción de crudo de petróleo y gas natural | Total | 0 | 06 | Total | inf |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 26047 | 2020 | País Vasco | 66775 | 95 Reparación de ordenadores, efectos personal... | Total | 971 | 95 | Total | 6.876931e+01 |
| 26048 | 2020 | País Vasco | 66775 | 951 Reparación de ordenadores y equipos de com... | Total | 155 | 95 | Total | 4.308065e+02 |
| 26049 | 2020 | País Vasco | 66775 | 952 Reparación de efectos personales y artícul... | Total | 816 | 95 | Total | 8.183211e+01 |
| 26050 | 2020 | País Vasco | 66775 | 96 Otros servicios personales | Total | 6140 | 96 | Total | 1.087541e+01 |
| 26051 | 2020 | País Vasco | 66775 | 960 Otros servicios personales | Total | 6140 | 96 | Total | 1.087541e+01 |
26052 rows × 9 columns
empresas_pequeñas_ccaa = empresas[empresas.ccaa.isin(CCAA_mostrar) & (empresas.estrato_asalariados.isin(['De 1 a 2', 'De 3 a 5', 'De 6 a 9', 'De 10 a 19'])) & (empresas.actividad_principal == "Total CNAE")].groupby(['periodo', 'ccaa'], as_index=False).agg({'total_empresas': 'sum'})
total_empresas = empresas[(empresas.estrato_asalariados == "Total") & (empresas.actividad_principal == "Total CNAE") ].rename(columns={'total_empresas': 'total_empresas_total'})
empresas_pequeñas_ccaa = empresas_pequeñas_ccaa.merge(total_empresas, on = ['periodo', 'ccaa'], how="left")
empresas_pequeñas_ccaa['porcentaje_empresas_pequeñas'] = empresas_pequeñas_ccaa['total_empresas']/empresas_pequeñas_ccaa['total_empresas_total']
create_multi_category_plot(data = empresas_pequeñas_ccaa, x_col="periodo", y_col="porcentaje_empresas_pequeñas", label = "CCAA",category_col="ccaa",
xlabel="Año", ylabel="Porcentaje (%)", title="Proporción de empresas pequeñas (1 a 20 trabajadores) por CCAA",
xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/empresas_pequeñas_ccaa.png")
Plot saved to ../../images/empresas_pequeñas_ccaa.png
empresas_pequeñas_ccaa = empresas[empresas.ccaa.isin(CCAA_mostrar) & ~(empresas.estrato_asalariados.isin(['Sin asalariados','De 1 a 2', 'De 3 a 5', 'De 6 a 9', 'De 10 a 19'])) & (empresas.actividad_principal == "Total CNAE")].groupby(['periodo', 'ccaa'], as_index=False).agg({'total_empresas': 'sum'})
total_empresas = empresas[(empresas.estrato_asalariados == "Total") & (empresas.actividad_principal == "Total CNAE") ].rename(columns={'total_empresas': 'total_empresas_total'})
empresas_pequeñas_ccaa = empresas_pequeñas_ccaa.merge(total_empresas, on = ['periodo', 'ccaa'], how="left")
empresas_pequeñas_ccaa['porcentaje_empresas_pequeñas'] = empresas_pequeñas_ccaa['total_empresas']/empresas_pequeñas_ccaa['total_empresas_total']
create_multi_category_plot(data = empresas_pequeñas_ccaa, x_col="periodo", y_col="porcentaje_empresas_pequeñas", label = "CCAA",category_col="ccaa",
xlabel="Año", ylabel="Porcentaje (%)", title="Proporción de empresas con >20 trabajadores por CCAA",
xticks_rotation=0, style="whitegrid", figsize=(12, 7), save_path="../../images/empresas_medianas_ccaa.png")
Plot saved to ../../images/empresas_medianas_ccaa.png
Se observa que el mercado está dominado por pequeñas y medianas empresas y por empresas sin asalariados, mientras que las grandes empresas tienen una presencia prácticamente despreciable. A nivel de comunidad autónoma se aprecia que la proporción de empresas con pocos empleados es dispar entre comunidades autónomas, y que esta disparidad no guarda un ordenamiento parecido al que hayamos observado en el pib o la productividad.
En lo que respecta a las empresas con más de 20 empleados, estas suponen un valor residual que no explica el decrecimiento porcentual de las empresas pequeñas a partir de 2015, y este vendría principalmente explicado por el incremento de empresas sin asalariados.
empresas.periodo.min()
2008
flujo_empresas = pd.read_csv("../../processed_data/empresas/flujo_empresas_nacional.csv")
flujo_empresas
| cond_juridica | actividad_principal_grupo | estrato_asalariados | periodo | alta_empresas | 2_dig_x | baja_empresas | 2_dig_y | permanencias | 2_dig | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | Otras formas jurídicas | 05 Extracción de antracita, hulla y lignito | De 1 a 5 | 2007 | 0 | 05 | 0 | 05 | 3 | 05 |
| 1 | Otras formas jurídicas | 05 Extracción de antracita, hulla y lignito | De 1 a 5 | 2008 | 0 | 05 | 1 | 05 | 2 | 05 |
| 2 | Otras formas jurídicas | 05 Extracción de antracita, hulla y lignito | De 1 a 5 | 2009 | 0 | 05 | 1 | 05 | 1 | 05 |
| 3 | Otras formas jurídicas | 05 Extracción de antracita, hulla y lignito | De 1 a 5 | 2010 | 0 | 05 | 0 | 05 | 0 | 05 |
| 4 | Otras formas jurídicas | 05 Extracción de antracita, hulla y lignito | De 1 a 5 | 2011 | 0 | 05 | 0 | 05 | 0 | 05 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| 39355 | Total | Total CNAE | Total | 2018 | 431528 | Total CNAE | 349350 | Total CNAE | 2931669 | Total CNAE |
| 39356 | Total | Total CNAE | Total | 2019 | 423837 | Total CNAE | 372856 | Total CNAE | 2980591 | Total CNAE |
| 39357 | Total | Total CNAE | Total | 2020 | 321749 | Total CNAE | 366548 | Total CNAE | 3044821 | Total CNAE |
| 39358 | Total | Total CNAE | Total | 2021 | 382960 | Total CNAE | 316340 | Total CNAE | 3047703 | Total CNAE |
| 39359 | Total | Total CNAE | Total | 2022 | 352142 | Total CNAE | 355028 | Total CNAE | 2855438 | Total CNAE |
39360 rows × 10 columns
flujo_empresas.actividad_principal_grupo.unique()
array(['05 Extracción de antracita, hulla y lignito',
'06 Extracción de crudo de petróleo y gas natural',
'07 Extracción de minerales metálicos',
'08 Otras industrias extractivas',
'09 Actividades de apoyo a las industrias extractivas',
'10 Industria de la alimentación', '11 Fabricación de bebidas',
'12 Industria del tabaco', '13 Industria textil',
'14 Confección de prendas de vestir',
'15 Industria del cuero y del calzado',
'16 Industria de la madera y del corcho, excepto muebles, cestería y espartería',
'17 Industria del papel',
'18 Artes gráficas y reproducción de soportes grabados',
'19 Coquerías y refino de petróleo', '20 Industria química',
'21 Fabricación de productos farmacéuticos',
'22 Fabricación de productos de caucho y plásticos',
'23 Fabricación de otros productos minerales no metálicos',
'24 Metalurgia, fabricación de productos de hierro, acero y ferroaleaciones',
'25 Fabricación de productos metálicos, excepto maquinaria y equipo',
'26 Fabricación de productos informáticos, electrónicos y ópticos',
'27 Fabricación de material y equipo eléctrico',
'28 Fabricación de maquinaria y equipo n.c.o.p.',
'29 Fabricación de vehículos de motor, remolques y semirremolques',
'30 Fabricación de otro material de transporte',
'31 Fabricación de muebles', '32 Otras industrias manufactureras',
'33 Reparación e instalación de maquinaria y equipo',
'35 Suministro de energía eléctrica, gas, vapor y aire acondicionado',
'36 Captación, depuración y distribución de agua',
'37 Recogida y tratamiento de aguas residuales',
'38 Recogida, tratamiento y eliminación de residuos, valorización',
'39 Actividades de descontaminación y otros servicios de gestión de residuos',
'41 Construcción de edificios', '42 Ingeniería civil',
'43 Actividades de construcción especializada',
'45 Venta y reparación de vehículos de motor y motocicletas',
'46 Comercio al por mayor e intermediarios del comercio, excepto de vehículos de motor y motocicletas',
'47 Comercio al por menor, excepto de vehículos de motor y motocicletas',
'49 Transporte terrestre y por tubería',
'50 Transporte marítimo y por vías navegables interiores',
'51 Transporte aéreo',
'52 Almacenamiento y actividades anexas al transporte',
'53 Actividades postales y de correos',
'55 Servicios de alojamiento', '56 Servicios de comidas y bebidas',
'58 Edición',
'59 Actividades cinematográficas, de vídeo y de programas de televisión, grabación de sonido y edición musical',
'60 Actividades de programación y emisión de radio y televisión',
'61 Telecomunicaciones',
'62 Programación, consultoría y otras actividades relacionadas con la informática',
'63 Servicios de información',
'64 Servicios financieros, excepto seguros y fondos de pensiones',
'65 Seguros, reaseguros y fondos de pensiones, excepto Seguridad Social obligatoria',
'66 Actividades auxiliares a los servicios financieros y a los seguros',
'68 Actividades inmobiliarias',
'69 Actividades jurídicas y de contabilidad',
'70 Actividades de las sedes centrales, actividades de consultoría de gestión empresarial',
'71 Servicios técnicos de arquitectura e ingeniería, ensayos y análisis técnicos',
'72 Investigación y desarrollo',
'73 Publicidad y estudios de mercado',
'74 Otras actividades profesionales, científicas y técnicas',
'75 Actividades veterinarias', '77 Actividades de alquiler',
'78 Actividades relacionadas con el empleo',
'79 Actividades de agencias de viajes, operadores turísticos, servicios de reservas y actividades relacionadas con los mismos',
'80 Actividades de seguridad e investigación',
'81 Servicios a edificios y actividades de jardinería',
'82 Actividades administrativas de oficina y otras actividades auxiliares a las empresas',
'85 Educación', '86 Actividades sanitarias',
'87 Asistencia en establecimientos residenciales',
'88 Actividades de servicios sociales sin alojamiento',
'90 Actividades de creación, artísticas y espectáculos',
'91 Actividades de bibliotecas, archivos, museos y otras actividades culturales',
'92 Actividades de juegos de azar y apuestas',
'93 Actividades deportivas, recreativas y de entretenimiento',
'94 Actividades asociativas',
'95 Reparación de ordenadores, efectos personales y artículos de uso doméstico',
'96 Otros servicios personales', 'Total CNAE'], dtype=object)
flujo_empresas[['actividad_principal_grupo', '2_dig']].drop_duplicates()
| actividad_principal_grupo | 2_dig | |
|---|---|---|
| 0 | 05 Extracción de antracita, hulla y lignito | 05 |
| 480 | 06 Extracción de crudo de petróleo y gas natural | 06 |
| 960 | 07 Extracción de minerales metálicos | 07 |
| 1440 | 08 Otras industrias extractivas | 08 |
| 1920 | 09 Actividades de apoyo a las industrias extra... | 09 |
| ... | ... | ... |
| 36960 | 93 Actividades deportivas, recreativas y de en... | 93 |
| 37440 | 94 Actividades asociativas | 94 |
| 37920 | 95 Reparación de ordenadores, efectos personal... | 95 |
| 38400 | 96 Otros servicios personales | 96 |
| 38880 | Total CNAE | Total CNAE |
82 rows × 2 columns
Pobreza y Desigualdad¶
La pobreza y la desigualdad suponen dos factores que nivel conceptual no deberían tener efecto como variable de entrada en un modelo en ninguno de las variables mencionadas previamente, pero sí que son una variable de salida interesante a estudiar, pues los incrementos de salario mínimo se justifican bajo la promeso de reducir desigualdad y pobreza.